package edu.zjut.hjg.saas.biz.service.impl;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.transaction.annotation.Transactional;

import edu.zjut.hjg.saas.biz.dao.TenantDao;
import edu.zjut.hjg.saas.biz.model.Tenant;
import edu.zjut.hjg.saas.biz.service.TenantService;
import edu.zjut.hjg.saas.biz.service.exception.ServiceException;
import edu.zjut.hjg.saas.biz.support.ServiceError;
import edu.zjut.hjg.saas.common.util.MD5Util;

public class TenantServiceImpl implements TenantService {

    private static final Log log = LogFactory.getLog(TenantServiceImpl.class);

    private TenantDao        tenantDao;

    public void setTenantDao(TenantDao tenantDao) {
        this.tenantDao = tenantDao;
    }

    @Override
    @Transactional(rollbackFor = { ServiceException.class })
    public Integer create(Tenant tenant) throws ServiceException {
        log.info("registerTenant: tenant=" + tenant);
        if (this.loginIdExist(tenant.getLoginId())) {
            String message = "registerTenant error, loginId Duplicate: loginId="
                    + tenant.getLoginId();
            log.error(message);
            throw new ServiceException(message, ServiceError.LOGIN_ID_DUPLICATE);
        }
        // 密码进行MD5哈希
        tenant.setPassword(MD5Util.toMD5(tenant.getPassword()));
        // 默认值
        setDefault(tenant);
        return tenantDao.create(tenant);
    }

    @Override
    public Tenant authenticate(String loginId, String password) {
        Tenant tenant = tenantDao.findByLoginId(loginId);
        if (tenant != null && tenant.getPassword().equals(MD5Util.toMD5(password))) {
            return tenant;
        }
        return null;
    }

    @Override
    public boolean loginIdExist(String loginId) {
        return tenantDao.findByLoginId(loginId) != null;
    }

    @Override
    public Tenant findById(Integer id) {
        return tenantDao.load(id);
    }

    @Override
    public void updatePassword(Integer id, String oldPassword, String newPassword)
            throws ServiceException {
        Tenant tenant = tenantDao.load(id);
        if (tenant == null) {
            throw new RuntimeException("tenant not found for id=" + id);
        } else if (!tenant.getPassword().equals(MD5Util.toMD5(oldPassword))) {
            // 原密码错误
            throw new ServiceException(ServiceError.PASSWORD_NOT_MATCH);
        }
        // 正确
        tenant.setPassword(MD5Util.toMD5(newPassword));
        tenantDao.update(tenant);
    }

    @Override
    public void update(Tenant tenant) {
        tenantDao.update(tenant);
    }

    /**
     * 设置默认值
     *
     * @param tenant
     */
    private void setDefault(Tenant tenant) {
        if (StringUtils.isBlank(tenant.getContact())) {
            tenant.setContact(null);
        }
        if (StringUtils.isBlank(tenant.getPhone())) {
            tenant.setPhone(null);
        }
    }
}
